#include<stdio.h>
#include<stdatomic.h>   // 原子操作
#include <unistd.h>     // 调用 sleep() 函数
#include <pthread.h>    // 调用 pthread_create() 函数

/*
gcc -std=c11 -m64 -pthread test-atomic.c -o a.out
./a.out
*/

// 原子整数 
atomic_int a = ATOMIC_VAR_INIT(0);

// 线程方法
void *ThreadFun(void *arg)
{
    int step = *(int*)arg;
    for (int i = 0; i < 10000000; i++)
    {
        atomic_fetch_add(&a, step);
    }
    return NULL;
}

int main(){
    // 两个线程
    pthread_t myThread1,myThread2;

    // 创建线程
    int step1 = 1;
    if (pthread_create(&myThread1, NULL, ThreadFun, (void*)&step1) != 0) {
        printf("线程创建失败");
        return 0;
    }
    int step2 = -1;
    if (pthread_create(&myThread2, NULL, ThreadFun, (void*)&step2) != 0) {
        printf("线程创建失败");
        return 0;
    }

    sleep(1);
    printf("%d\n", a);
    return 0;
}

// 创建线程 http://c.biancheng.net/thread/vip_8626.html
// An implementation of the C11 <stdatomic.h> interface  http://stdatomic.gforge.inria.fr/
// 5.44 Built-in functions for atomic memory access  https://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html
// C语言线程互斥和原子操作  http://c.biancheng.net/view/428.html
// gcc/g++ 如何支持c11 / c++11标准编译  https://www.cnblogs.com/qiumingcheng/p/7827081.html
// gcc -std=c11 -pthread test.c -o test